/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/
"use strict";

var $protobuf = require("protobufjs/minimal.js");

// Common aliases
var $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util;

// Exported root namespace
var $root = $protobuf.roots["default"] || ($protobuf.roots["default"] = {});

$root.GOnHookPet = (function() {

    /**
     * Properties of a GOnHookPet.
     * @exports IGOnHookPet
     * @interface IGOnHookPet
     * @property {string|null} [key] GOnHookPet key
     * @property {number|null} [petTbId] GOnHookPet petTbId
     * @property {number|null} [petLevel] GOnHookPet petLevel
     */

    /**
     * Constructs a new GOnHookPet.
     * @exports GOnHookPet
     * @classdesc Represents a GOnHookPet.
     * @implements IGOnHookPet
     * @constructor
     * @param {IGOnHookPet=} [properties] Properties to set
     */
    function GOnHookPet(properties) {
        if (properties)
            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                if (properties[keys[i]] != null)
                    this[keys[i]] = properties[keys[i]];
    }

    /**
     * GOnHookPet key.
     * @member {string} key
     * @memberof GOnHookPet
     * @instance
     */
    GOnHookPet.prototype.key = "";

    /**
     * GOnHookPet petTbId.
     * @member {number} petTbId
     * @memberof GOnHookPet
     * @instance
     */
    GOnHookPet.prototype.petTbId = 0;

    /**
     * GOnHookPet petLevel.
     * @member {number} petLevel
     * @memberof GOnHookPet
     * @instance
     */
    GOnHookPet.prototype.petLevel = 0;

    /**
     * Creates a new GOnHookPet instance using the specified properties.
     * @function create
     * @memberof GOnHookPet
     * @static
     * @param {IGOnHookPet=} [properties] Properties to set
     * @returns {GOnHookPet} GOnHookPet instance
     */
    GOnHookPet.create = function create(properties) {
        return new GOnHookPet(properties);
    };

    /**
     * Encodes the specified GOnHookPet message. Does not implicitly {@link GOnHookPet.verify|verify} messages.
     * @function encode
     * @memberof GOnHookPet
     * @static
     * @param {IGOnHookPet} message GOnHookPet message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    GOnHookPet.encode = function encode(message, writer) {
        if (!writer)
            writer = $Writer.create();
        if (message.key != null && Object.hasOwnProperty.call(message, "key"))
            writer.uint32(/* id 1, wireType 2 =*/10).string(message.key);
        if (message.petTbId != null && Object.hasOwnProperty.call(message, "petTbId"))
            writer.uint32(/* id 2, wireType 0 =*/16).int32(message.petTbId);
        if (message.petLevel != null && Object.hasOwnProperty.call(message, "petLevel"))
            writer.uint32(/* id 3, wireType 0 =*/24).int32(message.petLevel);
        return writer;
    };

    /**
     * Encodes the specified GOnHookPet message, length delimited. Does not implicitly {@link GOnHookPet.verify|verify} messages.
     * @function encodeDelimited
     * @memberof GOnHookPet
     * @static
     * @param {IGOnHookPet} message GOnHookPet message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    GOnHookPet.encodeDelimited = function encodeDelimited(message, writer) {
        return this.encode(message, writer).ldelim();
    };

    /**
     * Decodes a GOnHookPet message from the specified reader or buffer.
     * @function decode
     * @memberof GOnHookPet
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @param {number} [length] Message length if known beforehand
     * @returns {GOnHookPet} GOnHookPet
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    GOnHookPet.decode = function decode(reader, length) {
        if (!(reader instanceof $Reader))
            reader = $Reader.create(reader);
        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.GOnHookPet();
        while (reader.pos < end) {
            var tag = reader.uint32();
            switch (tag >>> 3) {
            case 1: {
                    message.key = reader.string();
                    break;
                }
            case 2: {
                    message.petTbId = reader.int32();
                    break;
                }
            case 3: {
                    message.petLevel = reader.int32();
                    break;
                }
            default:
                reader.skipType(tag & 7);
                break;
            }
        }
        return message;
    };

    /**
     * Decodes a GOnHookPet message from the specified reader or buffer, length delimited.
     * @function decodeDelimited
     * @memberof GOnHookPet
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @returns {GOnHookPet} GOnHookPet
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    GOnHookPet.decodeDelimited = function decodeDelimited(reader) {
        if (!(reader instanceof $Reader))
            reader = new $Reader(reader);
        return this.decode(reader, reader.uint32());
    };

    /**
     * Verifies a GOnHookPet message.
     * @function verify
     * @memberof GOnHookPet
     * @static
     * @param {Object.<string,*>} message Plain object to verify
     * @returns {string|null} `null` if valid, otherwise the reason why it is not
     */
    GOnHookPet.verify = function verify(message) {
        if (typeof message !== "object" || message === null)
            return "object expected";
        if (message.key != null && message.hasOwnProperty("key"))
            if (!$util.isString(message.key))
                return "key: string expected";
        if (message.petTbId != null && message.hasOwnProperty("petTbId"))
            if (!$util.isInteger(message.petTbId))
                return "petTbId: integer expected";
        if (message.petLevel != null && message.hasOwnProperty("petLevel"))
            if (!$util.isInteger(message.petLevel))
                return "petLevel: integer expected";
        return null;
    };

    /**
     * Creates a GOnHookPet message from a plain object. Also converts values to their respective internal types.
     * @function fromObject
     * @memberof GOnHookPet
     * @static
     * @param {Object.<string,*>} object Plain object
     * @returns {GOnHookPet} GOnHookPet
     */
    GOnHookPet.fromObject = function fromObject(object) {
        if (object instanceof $root.GOnHookPet)
            return object;
        var message = new $root.GOnHookPet();
        if (object.key != null)
            message.key = String(object.key);
        if (object.petTbId != null)
            message.petTbId = object.petTbId | 0;
        if (object.petLevel != null)
            message.petLevel = object.petLevel | 0;
        return message;
    };

    /**
     * Creates a plain object from a GOnHookPet message. Also converts values to other types if specified.
     * @function toObject
     * @memberof GOnHookPet
     * @static
     * @param {GOnHookPet} message GOnHookPet
     * @param {$protobuf.IConversionOptions} [options] Conversion options
     * @returns {Object.<string,*>} Plain object
     */
    GOnHookPet.toObject = function toObject(message, options) {
        if (!options)
            options = {};
        var object = {};
        if (options.defaults) {
            object.key = "";
            object.petTbId = 0;
            object.petLevel = 0;
        }
        if (message.key != null && message.hasOwnProperty("key"))
            object.key = message.key;
        if (message.petTbId != null && message.hasOwnProperty("petTbId"))
            object.petTbId = message.petTbId;
        if (message.petLevel != null && message.hasOwnProperty("petLevel"))
            object.petLevel = message.petLevel;
        return object;
    };

    /**
     * Converts this GOnHookPet to JSON.
     * @function toJSON
     * @memberof GOnHookPet
     * @instance
     * @returns {Object.<string,*>} JSON object
     */
    GOnHookPet.prototype.toJSON = function toJSON() {
        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
    };

    /**
     * Gets the default type url for GOnHookPet
     * @function getTypeUrl
     * @memberof GOnHookPet
     * @static
     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
     * @returns {string} The default type url
     */
    GOnHookPet.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
        if (typeUrlPrefix === undefined) {
            typeUrlPrefix = "type.googleapis.com";
        }
        return typeUrlPrefix + "/GOnHookPet";
    };

    return GOnHookPet;
})();

$root.GOnHookPets = (function() {

    /**
     * Properties of a GOnHookPets.
     * @exports IGOnHookPets
     * @interface IGOnHookPets
     * @property {Array.<IGOnHookPet>|null} [pets] GOnHookPets pets
     */

    /**
     * Constructs a new GOnHookPets.
     * @exports GOnHookPets
     * @classdesc Represents a GOnHookPets.
     * @implements IGOnHookPets
     * @constructor
     * @param {IGOnHookPets=} [properties] Properties to set
     */
    function GOnHookPets(properties) {
        this.pets = [];
        if (properties)
            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                if (properties[keys[i]] != null)
                    this[keys[i]] = properties[keys[i]];
    }

    /**
     * GOnHookPets pets.
     * @member {Array.<IGOnHookPet>} pets
     * @memberof GOnHookPets
     * @instance
     */
    GOnHookPets.prototype.pets = $util.emptyArray;

    /**
     * Creates a new GOnHookPets instance using the specified properties.
     * @function create
     * @memberof GOnHookPets
     * @static
     * @param {IGOnHookPets=} [properties] Properties to set
     * @returns {GOnHookPets} GOnHookPets instance
     */
    GOnHookPets.create = function create(properties) {
        return new GOnHookPets(properties);
    };

    /**
     * Encodes the specified GOnHookPets message. Does not implicitly {@link GOnHookPets.verify|verify} messages.
     * @function encode
     * @memberof GOnHookPets
     * @static
     * @param {IGOnHookPets} message GOnHookPets message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    GOnHookPets.encode = function encode(message, writer) {
        if (!writer)
            writer = $Writer.create();
        if (message.pets != null && message.pets.length)
            for (var i = 0; i < message.pets.length; ++i)
                $root.GOnHookPet.encode(message.pets[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
        return writer;
    };

    /**
     * Encodes the specified GOnHookPets message, length delimited. Does not implicitly {@link GOnHookPets.verify|verify} messages.
     * @function encodeDelimited
     * @memberof GOnHookPets
     * @static
     * @param {IGOnHookPets} message GOnHookPets message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    GOnHookPets.encodeDelimited = function encodeDelimited(message, writer) {
        return this.encode(message, writer).ldelim();
    };

    /**
     * Decodes a GOnHookPets message from the specified reader or buffer.
     * @function decode
     * @memberof GOnHookPets
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @param {number} [length] Message length if known beforehand
     * @returns {GOnHookPets} GOnHookPets
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    GOnHookPets.decode = function decode(reader, length) {
        if (!(reader instanceof $Reader))
            reader = $Reader.create(reader);
        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.GOnHookPets();
        while (reader.pos < end) {
            var tag = reader.uint32();
            switch (tag >>> 3) {
            case 1: {
                    if (!(message.pets && message.pets.length))
                        message.pets = [];
                    message.pets.push($root.GOnHookPet.decode(reader, reader.uint32()));
                    break;
                }
            default:
                reader.skipType(tag & 7);
                break;
            }
        }
        return message;
    };

    /**
     * Decodes a GOnHookPets message from the specified reader or buffer, length delimited.
     * @function decodeDelimited
     * @memberof GOnHookPets
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @returns {GOnHookPets} GOnHookPets
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    GOnHookPets.decodeDelimited = function decodeDelimited(reader) {
        if (!(reader instanceof $Reader))
            reader = new $Reader(reader);
        return this.decode(reader, reader.uint32());
    };

    /**
     * Verifies a GOnHookPets message.
     * @function verify
     * @memberof GOnHookPets
     * @static
     * @param {Object.<string,*>} message Plain object to verify
     * @returns {string|null} `null` if valid, otherwise the reason why it is not
     */
    GOnHookPets.verify = function verify(message) {
        if (typeof message !== "object" || message === null)
            return "object expected";
        if (message.pets != null && message.hasOwnProperty("pets")) {
            if (!Array.isArray(message.pets))
                return "pets: array expected";
            for (var i = 0; i < message.pets.length; ++i) {
                var error = $root.GOnHookPet.verify(message.pets[i]);
                if (error)
                    return "pets." + error;
            }
        }
        return null;
    };

    /**
     * Creates a GOnHookPets message from a plain object. Also converts values to their respective internal types.
     * @function fromObject
     * @memberof GOnHookPets
     * @static
     * @param {Object.<string,*>} object Plain object
     * @returns {GOnHookPets} GOnHookPets
     */
    GOnHookPets.fromObject = function fromObject(object) {
        if (object instanceof $root.GOnHookPets)
            return object;
        var message = new $root.GOnHookPets();
        if (object.pets) {
            if (!Array.isArray(object.pets))
                throw TypeError(".GOnHookPets.pets: array expected");
            message.pets = [];
            for (var i = 0; i < object.pets.length; ++i) {
                if (typeof object.pets[i] !== "object")
                    throw TypeError(".GOnHookPets.pets: object expected");
                message.pets[i] = $root.GOnHookPet.fromObject(object.pets[i]);
            }
        }
        return message;
    };

    /**
     * Creates a plain object from a GOnHookPets message. Also converts values to other types if specified.
     * @function toObject
     * @memberof GOnHookPets
     * @static
     * @param {GOnHookPets} message GOnHookPets
     * @param {$protobuf.IConversionOptions} [options] Conversion options
     * @returns {Object.<string,*>} Plain object
     */
    GOnHookPets.toObject = function toObject(message, options) {
        if (!options)
            options = {};
        var object = {};
        if (options.arrays || options.defaults)
            object.pets = [];
        if (message.pets && message.pets.length) {
            object.pets = [];
            for (var j = 0; j < message.pets.length; ++j)
                object.pets[j] = $root.GOnHookPet.toObject(message.pets[j], options);
        }
        return object;
    };

    /**
     * Converts this GOnHookPets to JSON.
     * @function toJSON
     * @memberof GOnHookPets
     * @instance
     * @returns {Object.<string,*>} JSON object
     */
    GOnHookPets.prototype.toJSON = function toJSON() {
        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
    };

    /**
     * Gets the default type url for GOnHookPets
     * @function getTypeUrl
     * @memberof GOnHookPets
     * @static
     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
     * @returns {string} The default type url
     */
    GOnHookPets.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
        if (typeUrlPrefix === undefined) {
            typeUrlPrefix = "type.googleapis.com";
        }
        return typeUrlPrefix + "/GOnHookPets";
    };

    return GOnHookPets;
})();

$root.GPVPStart = (function() {

    /**
     * Properties of a GPVPStart.
     * @exports IGPVPStart
     * @interface IGPVPStart
     * @property {string|null} [leftTactical] GPVPStart leftTactical
     * @property {Object.<string,string>|null} [leftPets] GPVPStart leftPets
     * @property {string|null} [rightTactical] GPVPStart rightTactical
     * @property {Object.<string,string>|null} [rightPets] GPVPStart rightPets
     * @property {number|Long|null} [leftPlayerId] GPVPStart leftPlayerId
     * @property {number|Long|null} [rightPlayerId] GPVPStart rightPlayerId
     */

    /**
     * Constructs a new GPVPStart.
     * @exports GPVPStart
     * @classdesc Represents a GPVPStart.
     * @implements IGPVPStart
     * @constructor
     * @param {IGPVPStart=} [properties] Properties to set
     */
    function GPVPStart(properties) {
        this.leftPets = {};
        this.rightPets = {};
        if (properties)
            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                if (properties[keys[i]] != null)
                    this[keys[i]] = properties[keys[i]];
    }

    /**
     * GPVPStart leftTactical.
     * @member {string} leftTactical
     * @memberof GPVPStart
     * @instance
     */
    GPVPStart.prototype.leftTactical = "";

    /**
     * GPVPStart leftPets.
     * @member {Object.<string,string>} leftPets
     * @memberof GPVPStart
     * @instance
     */
    GPVPStart.prototype.leftPets = $util.emptyObject;

    /**
     * GPVPStart rightTactical.
     * @member {string} rightTactical
     * @memberof GPVPStart
     * @instance
     */
    GPVPStart.prototype.rightTactical = "";

    /**
     * GPVPStart rightPets.
     * @member {Object.<string,string>} rightPets
     * @memberof GPVPStart
     * @instance
     */
    GPVPStart.prototype.rightPets = $util.emptyObject;

    /**
     * GPVPStart leftPlayerId.
     * @member {number|Long} leftPlayerId
     * @memberof GPVPStart
     * @instance
     */
    GPVPStart.prototype.leftPlayerId = $util.Long ? $util.Long.fromBits(0,0,false) : 0;

    /**
     * GPVPStart rightPlayerId.
     * @member {number|Long} rightPlayerId
     * @memberof GPVPStart
     * @instance
     */
    GPVPStart.prototype.rightPlayerId = $util.Long ? $util.Long.fromBits(0,0,false) : 0;

    /**
     * Creates a new GPVPStart instance using the specified properties.
     * @function create
     * @memberof GPVPStart
     * @static
     * @param {IGPVPStart=} [properties] Properties to set
     * @returns {GPVPStart} GPVPStart instance
     */
    GPVPStart.create = function create(properties) {
        return new GPVPStart(properties);
    };

    /**
     * Encodes the specified GPVPStart message. Does not implicitly {@link GPVPStart.verify|verify} messages.
     * @function encode
     * @memberof GPVPStart
     * @static
     * @param {IGPVPStart} message GPVPStart message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    GPVPStart.encode = function encode(message, writer) {
        if (!writer)
            writer = $Writer.create();
        if (message.leftTactical != null && Object.hasOwnProperty.call(message, "leftTactical"))
            writer.uint32(/* id 1, wireType 2 =*/10).string(message.leftTactical);
        if (message.leftPets != null && Object.hasOwnProperty.call(message, "leftPets"))
            for (var keys = Object.keys(message.leftPets), i = 0; i < keys.length; ++i)
                writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 0 =*/8).int64(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.leftPets[keys[i]]).ldelim();
        if (message.rightTactical != null && Object.hasOwnProperty.call(message, "rightTactical"))
            writer.uint32(/* id 3, wireType 2 =*/26).string(message.rightTactical);
        if (message.rightPets != null && Object.hasOwnProperty.call(message, "rightPets"))
            for (var keys = Object.keys(message.rightPets), i = 0; i < keys.length; ++i)
                writer.uint32(/* id 4, wireType 2 =*/34).fork().uint32(/* id 1, wireType 0 =*/8).int64(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.rightPets[keys[i]]).ldelim();
        if (message.leftPlayerId != null && Object.hasOwnProperty.call(message, "leftPlayerId"))
            writer.uint32(/* id 5, wireType 0 =*/40).int64(message.leftPlayerId);
        if (message.rightPlayerId != null && Object.hasOwnProperty.call(message, "rightPlayerId"))
            writer.uint32(/* id 6, wireType 0 =*/48).int64(message.rightPlayerId);
        return writer;
    };

    /**
     * Encodes the specified GPVPStart message, length delimited. Does not implicitly {@link GPVPStart.verify|verify} messages.
     * @function encodeDelimited
     * @memberof GPVPStart
     * @static
     * @param {IGPVPStart} message GPVPStart message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    GPVPStart.encodeDelimited = function encodeDelimited(message, writer) {
        return this.encode(message, writer).ldelim();
    };

    /**
     * Decodes a GPVPStart message from the specified reader or buffer.
     * @function decode
     * @memberof GPVPStart
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @param {number} [length] Message length if known beforehand
     * @returns {GPVPStart} GPVPStart
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    GPVPStart.decode = function decode(reader, length) {
        if (!(reader instanceof $Reader))
            reader = $Reader.create(reader);
        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.GPVPStart(), key, value;
        while (reader.pos < end) {
            var tag = reader.uint32();
            switch (tag >>> 3) {
            case 1: {
                    message.leftTactical = reader.string();
                    break;
                }
            case 2: {
                    if (message.leftPets === $util.emptyObject)
                        message.leftPets = {};
                    var end2 = reader.uint32() + reader.pos;
                    key = 0;
                    value = "";
                    while (reader.pos < end2) {
                        var tag2 = reader.uint32();
                        switch (tag2 >>> 3) {
                        case 1:
                            key = reader.int64();
                            break;
                        case 2:
                            value = reader.string();
                            break;
                        default:
                            reader.skipType(tag2 & 7);
                            break;
                        }
                    }
                    message.leftPets[typeof key === "object" ? $util.longToHash(key) : key] = value;
                    break;
                }
            case 3: {
                    message.rightTactical = reader.string();
                    break;
                }
            case 4: {
                    if (message.rightPets === $util.emptyObject)
                        message.rightPets = {};
                    var end2 = reader.uint32() + reader.pos;
                    key = 0;
                    value = "";
                    while (reader.pos < end2) {
                        var tag2 = reader.uint32();
                        switch (tag2 >>> 3) {
                        case 1:
                            key = reader.int64();
                            break;
                        case 2:
                            value = reader.string();
                            break;
                        default:
                            reader.skipType(tag2 & 7);
                            break;
                        }
                    }
                    message.rightPets[typeof key === "object" ? $util.longToHash(key) : key] = value;
                    break;
                }
            case 5: {
                    message.leftPlayerId = reader.int64();
                    break;
                }
            case 6: {
                    message.rightPlayerId = reader.int64();
                    break;
                }
            default:
                reader.skipType(tag & 7);
                break;
            }
        }
        return message;
    };

    /**
     * Decodes a GPVPStart message from the specified reader or buffer, length delimited.
     * @function decodeDelimited
     * @memberof GPVPStart
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @returns {GPVPStart} GPVPStart
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    GPVPStart.decodeDelimited = function decodeDelimited(reader) {
        if (!(reader instanceof $Reader))
            reader = new $Reader(reader);
        return this.decode(reader, reader.uint32());
    };

    /**
     * Verifies a GPVPStart message.
     * @function verify
     * @memberof GPVPStart
     * @static
     * @param {Object.<string,*>} message Plain object to verify
     * @returns {string|null} `null` if valid, otherwise the reason why it is not
     */
    GPVPStart.verify = function verify(message) {
        if (typeof message !== "object" || message === null)
            return "object expected";
        if (message.leftTactical != null && message.hasOwnProperty("leftTactical"))
            if (!$util.isString(message.leftTactical))
                return "leftTactical: string expected";
        if (message.leftPets != null && message.hasOwnProperty("leftPets")) {
            if (!$util.isObject(message.leftPets))
                return "leftPets: object expected";
            var key = Object.keys(message.leftPets);
            for (var i = 0; i < key.length; ++i) {
                if (!$util.key64Re.test(key[i]))
                    return "leftPets: integer|Long key{k:int64} expected";
                if (!$util.isString(message.leftPets[key[i]]))
                    return "leftPets: string{k:int64} expected";
            }
        }
        if (message.rightTactical != null && message.hasOwnProperty("rightTactical"))
            if (!$util.isString(message.rightTactical))
                return "rightTactical: string expected";
        if (message.rightPets != null && message.hasOwnProperty("rightPets")) {
            if (!$util.isObject(message.rightPets))
                return "rightPets: object expected";
            var key = Object.keys(message.rightPets);
            for (var i = 0; i < key.length; ++i) {
                if (!$util.key64Re.test(key[i]))
                    return "rightPets: integer|Long key{k:int64} expected";
                if (!$util.isString(message.rightPets[key[i]]))
                    return "rightPets: string{k:int64} expected";
            }
        }
        if (message.leftPlayerId != null && message.hasOwnProperty("leftPlayerId"))
            if (!$util.isInteger(message.leftPlayerId) && !(message.leftPlayerId && $util.isInteger(message.leftPlayerId.low) && $util.isInteger(message.leftPlayerId.high)))
                return "leftPlayerId: integer|Long expected";
        if (message.rightPlayerId != null && message.hasOwnProperty("rightPlayerId"))
            if (!$util.isInteger(message.rightPlayerId) && !(message.rightPlayerId && $util.isInteger(message.rightPlayerId.low) && $util.isInteger(message.rightPlayerId.high)))
                return "rightPlayerId: integer|Long expected";
        return null;
    };

    /**
     * Creates a GPVPStart message from a plain object. Also converts values to their respective internal types.
     * @function fromObject
     * @memberof GPVPStart
     * @static
     * @param {Object.<string,*>} object Plain object
     * @returns {GPVPStart} GPVPStart
     */
    GPVPStart.fromObject = function fromObject(object) {
        if (object instanceof $root.GPVPStart)
            return object;
        var message = new $root.GPVPStart();
        if (object.leftTactical != null)
            message.leftTactical = String(object.leftTactical);
        if (object.leftPets) {
            if (typeof object.leftPets !== "object")
                throw TypeError(".GPVPStart.leftPets: object expected");
            message.leftPets = {};
            for (var keys = Object.keys(object.leftPets), i = 0; i < keys.length; ++i)
                message.leftPets[keys[i]] = String(object.leftPets[keys[i]]);
        }
        if (object.rightTactical != null)
            message.rightTactical = String(object.rightTactical);
        if (object.rightPets) {
            if (typeof object.rightPets !== "object")
                throw TypeError(".GPVPStart.rightPets: object expected");
            message.rightPets = {};
            for (var keys = Object.keys(object.rightPets), i = 0; i < keys.length; ++i)
                message.rightPets[keys[i]] = String(object.rightPets[keys[i]]);
        }
        if (object.leftPlayerId != null)
            if ($util.Long)
                (message.leftPlayerId = $util.Long.fromValue(object.leftPlayerId)).unsigned = false;
            else if (typeof object.leftPlayerId === "string")
                message.leftPlayerId = parseInt(object.leftPlayerId, 10);
            else if (typeof object.leftPlayerId === "number")
                message.leftPlayerId = object.leftPlayerId;
            else if (typeof object.leftPlayerId === "object")
                message.leftPlayerId = new $util.LongBits(object.leftPlayerId.low >>> 0, object.leftPlayerId.high >>> 0).toNumber();
        if (object.rightPlayerId != null)
            if ($util.Long)
                (message.rightPlayerId = $util.Long.fromValue(object.rightPlayerId)).unsigned = false;
            else if (typeof object.rightPlayerId === "string")
                message.rightPlayerId = parseInt(object.rightPlayerId, 10);
            else if (typeof object.rightPlayerId === "number")
                message.rightPlayerId = object.rightPlayerId;
            else if (typeof object.rightPlayerId === "object")
                message.rightPlayerId = new $util.LongBits(object.rightPlayerId.low >>> 0, object.rightPlayerId.high >>> 0).toNumber();
        return message;
    };

    /**
     * Creates a plain object from a GPVPStart message. Also converts values to other types if specified.
     * @function toObject
     * @memberof GPVPStart
     * @static
     * @param {GPVPStart} message GPVPStart
     * @param {$protobuf.IConversionOptions} [options] Conversion options
     * @returns {Object.<string,*>} Plain object
     */
    GPVPStart.toObject = function toObject(message, options) {
        if (!options)
            options = {};
        var object = {};
        if (options.objects || options.defaults) {
            object.leftPets = {};
            object.rightPets = {};
        }
        if (options.defaults) {
            object.leftTactical = "";
            object.rightTactical = "";
            if ($util.Long) {
                var long = new $util.Long(0, 0, false);
                object.leftPlayerId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
            } else
                object.leftPlayerId = options.longs === String ? "0" : 0;
            if ($util.Long) {
                var long = new $util.Long(0, 0, false);
                object.rightPlayerId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
            } else
                object.rightPlayerId = options.longs === String ? "0" : 0;
        }
        if (message.leftTactical != null && message.hasOwnProperty("leftTactical"))
            object.leftTactical = message.leftTactical;
        var keys2;
        if (message.leftPets && (keys2 = Object.keys(message.leftPets)).length) {
            object.leftPets = {};
            for (var j = 0; j < keys2.length; ++j)
                object.leftPets[keys2[j]] = message.leftPets[keys2[j]];
        }
        if (message.rightTactical != null && message.hasOwnProperty("rightTactical"))
            object.rightTactical = message.rightTactical;
        if (message.rightPets && (keys2 = Object.keys(message.rightPets)).length) {
            object.rightPets = {};
            for (var j = 0; j < keys2.length; ++j)
                object.rightPets[keys2[j]] = message.rightPets[keys2[j]];
        }
        if (message.leftPlayerId != null && message.hasOwnProperty("leftPlayerId"))
            if (typeof message.leftPlayerId === "number")
                object.leftPlayerId = options.longs === String ? String(message.leftPlayerId) : message.leftPlayerId;
            else
                object.leftPlayerId = options.longs === String ? $util.Long.prototype.toString.call(message.leftPlayerId) : options.longs === Number ? new $util.LongBits(message.leftPlayerId.low >>> 0, message.leftPlayerId.high >>> 0).toNumber() : message.leftPlayerId;
        if (message.rightPlayerId != null && message.hasOwnProperty("rightPlayerId"))
            if (typeof message.rightPlayerId === "number")
                object.rightPlayerId = options.longs === String ? String(message.rightPlayerId) : message.rightPlayerId;
            else
                object.rightPlayerId = options.longs === String ? $util.Long.prototype.toString.call(message.rightPlayerId) : options.longs === Number ? new $util.LongBits(message.rightPlayerId.low >>> 0, message.rightPlayerId.high >>> 0).toNumber() : message.rightPlayerId;
        return object;
    };

    /**
     * Converts this GPVPStart to JSON.
     * @function toJSON
     * @memberof GPVPStart
     * @instance
     * @returns {Object.<string,*>} JSON object
     */
    GPVPStart.prototype.toJSON = function toJSON() {
        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
    };

    /**
     * Gets the default type url for GPVPStart
     * @function getTypeUrl
     * @memberof GPVPStart
     * @static
     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
     * @returns {string} The default type url
     */
    GPVPStart.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
        if (typeUrlPrefix === undefined) {
            typeUrlPrefix = "type.googleapis.com";
        }
        return typeUrlPrefix + "/GPVPStart";
    };

    return GPVPStart;
})();

$root.GPVPText = (function() {

    /**
     * Properties of a GPVPText.
     * @exports IGPVPText
     * @interface IGPVPText
     * @property {string|null} [text] GPVPText text
     */

    /**
     * Constructs a new GPVPText.
     * @exports GPVPText
     * @classdesc Represents a GPVPText.
     * @implements IGPVPText
     * @constructor
     * @param {IGPVPText=} [properties] Properties to set
     */
    function GPVPText(properties) {
        if (properties)
            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                if (properties[keys[i]] != null)
                    this[keys[i]] = properties[keys[i]];
    }

    /**
     * GPVPText text.
     * @member {string} text
     * @memberof GPVPText
     * @instance
     */
    GPVPText.prototype.text = "";

    /**
     * Creates a new GPVPText instance using the specified properties.
     * @function create
     * @memberof GPVPText
     * @static
     * @param {IGPVPText=} [properties] Properties to set
     * @returns {GPVPText} GPVPText instance
     */
    GPVPText.create = function create(properties) {
        return new GPVPText(properties);
    };

    /**
     * Encodes the specified GPVPText message. Does not implicitly {@link GPVPText.verify|verify} messages.
     * @function encode
     * @memberof GPVPText
     * @static
     * @param {IGPVPText} message GPVPText message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    GPVPText.encode = function encode(message, writer) {
        if (!writer)
            writer = $Writer.create();
        if (message.text != null && Object.hasOwnProperty.call(message, "text"))
            writer.uint32(/* id 1, wireType 2 =*/10).string(message.text);
        return writer;
    };

    /**
     * Encodes the specified GPVPText message, length delimited. Does not implicitly {@link GPVPText.verify|verify} messages.
     * @function encodeDelimited
     * @memberof GPVPText
     * @static
     * @param {IGPVPText} message GPVPText message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    GPVPText.encodeDelimited = function encodeDelimited(message, writer) {
        return this.encode(message, writer).ldelim();
    };

    /**
     * Decodes a GPVPText message from the specified reader or buffer.
     * @function decode
     * @memberof GPVPText
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @param {number} [length] Message length if known beforehand
     * @returns {GPVPText} GPVPText
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    GPVPText.decode = function decode(reader, length) {
        if (!(reader instanceof $Reader))
            reader = $Reader.create(reader);
        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.GPVPText();
        while (reader.pos < end) {
            var tag = reader.uint32();
            switch (tag >>> 3) {
            case 1: {
                    message.text = reader.string();
                    break;
                }
            default:
                reader.skipType(tag & 7);
                break;
            }
        }
        return message;
    };

    /**
     * Decodes a GPVPText message from the specified reader or buffer, length delimited.
     * @function decodeDelimited
     * @memberof GPVPText
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @returns {GPVPText} GPVPText
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    GPVPText.decodeDelimited = function decodeDelimited(reader) {
        if (!(reader instanceof $Reader))
            reader = new $Reader(reader);
        return this.decode(reader, reader.uint32());
    };

    /**
     * Verifies a GPVPText message.
     * @function verify
     * @memberof GPVPText
     * @static
     * @param {Object.<string,*>} message Plain object to verify
     * @returns {string|null} `null` if valid, otherwise the reason why it is not
     */
    GPVPText.verify = function verify(message) {
        if (typeof message !== "object" || message === null)
            return "object expected";
        if (message.text != null && message.hasOwnProperty("text"))
            if (!$util.isString(message.text))
                return "text: string expected";
        return null;
    };

    /**
     * Creates a GPVPText message from a plain object. Also converts values to their respective internal types.
     * @function fromObject
     * @memberof GPVPText
     * @static
     * @param {Object.<string,*>} object Plain object
     * @returns {GPVPText} GPVPText
     */
    GPVPText.fromObject = function fromObject(object) {
        if (object instanceof $root.GPVPText)
            return object;
        var message = new $root.GPVPText();
        if (object.text != null)
            message.text = String(object.text);
        return message;
    };

    /**
     * Creates a plain object from a GPVPText message. Also converts values to other types if specified.
     * @function toObject
     * @memberof GPVPText
     * @static
     * @param {GPVPText} message GPVPText
     * @param {$protobuf.IConversionOptions} [options] Conversion options
     * @returns {Object.<string,*>} Plain object
     */
    GPVPText.toObject = function toObject(message, options) {
        if (!options)
            options = {};
        var object = {};
        if (options.defaults)
            object.text = "";
        if (message.text != null && message.hasOwnProperty("text"))
            object.text = message.text;
        return object;
    };

    /**
     * Converts this GPVPText to JSON.
     * @function toJSON
     * @memberof GPVPText
     * @instance
     * @returns {Object.<string,*>} JSON object
     */
    GPVPText.prototype.toJSON = function toJSON() {
        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
    };

    /**
     * Gets the default type url for GPVPText
     * @function getTypeUrl
     * @memberof GPVPText
     * @static
     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
     * @returns {string} The default type url
     */
    GPVPText.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
        if (typeUrlPrefix === undefined) {
            typeUrlPrefix = "type.googleapis.com";
        }
        return typeUrlPrefix + "/GPVPText";
    };

    return GPVPText;
})();

$root.GPVPRefereeInfo = (function() {

    /**
     * Properties of a GPVPRefereeInfo.
     * @exports IGPVPRefereeInfo
     * @interface IGPVPRefereeInfo
     * @property {number|Long|null} [winnerId] GPVPRefereeInfo winnerId
     */

    /**
     * Constructs a new GPVPRefereeInfo.
     * @exports GPVPRefereeInfo
     * @classdesc Represents a GPVPRefereeInfo.
     * @implements IGPVPRefereeInfo
     * @constructor
     * @param {IGPVPRefereeInfo=} [properties] Properties to set
     */
    function GPVPRefereeInfo(properties) {
        if (properties)
            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                if (properties[keys[i]] != null)
                    this[keys[i]] = properties[keys[i]];
    }

    /**
     * GPVPRefereeInfo winnerId.
     * @member {number|Long} winnerId
     * @memberof GPVPRefereeInfo
     * @instance
     */
    GPVPRefereeInfo.prototype.winnerId = $util.Long ? $util.Long.fromBits(0,0,false) : 0;

    /**
     * Creates a new GPVPRefereeInfo instance using the specified properties.
     * @function create
     * @memberof GPVPRefereeInfo
     * @static
     * @param {IGPVPRefereeInfo=} [properties] Properties to set
     * @returns {GPVPRefereeInfo} GPVPRefereeInfo instance
     */
    GPVPRefereeInfo.create = function create(properties) {
        return new GPVPRefereeInfo(properties);
    };

    /**
     * Encodes the specified GPVPRefereeInfo message. Does not implicitly {@link GPVPRefereeInfo.verify|verify} messages.
     * @function encode
     * @memberof GPVPRefereeInfo
     * @static
     * @param {IGPVPRefereeInfo} message GPVPRefereeInfo message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    GPVPRefereeInfo.encode = function encode(message, writer) {
        if (!writer)
            writer = $Writer.create();
        if (message.winnerId != null && Object.hasOwnProperty.call(message, "winnerId"))
            writer.uint32(/* id 1, wireType 0 =*/8).int64(message.winnerId);
        return writer;
    };

    /**
     * Encodes the specified GPVPRefereeInfo message, length delimited. Does not implicitly {@link GPVPRefereeInfo.verify|verify} messages.
     * @function encodeDelimited
     * @memberof GPVPRefereeInfo
     * @static
     * @param {IGPVPRefereeInfo} message GPVPRefereeInfo message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    GPVPRefereeInfo.encodeDelimited = function encodeDelimited(message, writer) {
        return this.encode(message, writer).ldelim();
    };

    /**
     * Decodes a GPVPRefereeInfo message from the specified reader or buffer.
     * @function decode
     * @memberof GPVPRefereeInfo
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @param {number} [length] Message length if known beforehand
     * @returns {GPVPRefereeInfo} GPVPRefereeInfo
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    GPVPRefereeInfo.decode = function decode(reader, length) {
        if (!(reader instanceof $Reader))
            reader = $Reader.create(reader);
        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.GPVPRefereeInfo();
        while (reader.pos < end) {
            var tag = reader.uint32();
            switch (tag >>> 3) {
            case 1: {
                    message.winnerId = reader.int64();
                    break;
                }
            default:
                reader.skipType(tag & 7);
                break;
            }
        }
        return message;
    };

    /**
     * Decodes a GPVPRefereeInfo message from the specified reader or buffer, length delimited.
     * @function decodeDelimited
     * @memberof GPVPRefereeInfo
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @returns {GPVPRefereeInfo} GPVPRefereeInfo
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    GPVPRefereeInfo.decodeDelimited = function decodeDelimited(reader) {
        if (!(reader instanceof $Reader))
            reader = new $Reader(reader);
        return this.decode(reader, reader.uint32());
    };

    /**
     * Verifies a GPVPRefereeInfo message.
     * @function verify
     * @memberof GPVPRefereeInfo
     * @static
     * @param {Object.<string,*>} message Plain object to verify
     * @returns {string|null} `null` if valid, otherwise the reason why it is not
     */
    GPVPRefereeInfo.verify = function verify(message) {
        if (typeof message !== "object" || message === null)
            return "object expected";
        if (message.winnerId != null && message.hasOwnProperty("winnerId"))
            if (!$util.isInteger(message.winnerId) && !(message.winnerId && $util.isInteger(message.winnerId.low) && $util.isInteger(message.winnerId.high)))
                return "winnerId: integer|Long expected";
        return null;
    };

    /**
     * Creates a GPVPRefereeInfo message from a plain object. Also converts values to their respective internal types.
     * @function fromObject
     * @memberof GPVPRefereeInfo
     * @static
     * @param {Object.<string,*>} object Plain object
     * @returns {GPVPRefereeInfo} GPVPRefereeInfo
     */
    GPVPRefereeInfo.fromObject = function fromObject(object) {
        if (object instanceof $root.GPVPRefereeInfo)
            return object;
        var message = new $root.GPVPRefereeInfo();
        if (object.winnerId != null)
            if ($util.Long)
                (message.winnerId = $util.Long.fromValue(object.winnerId)).unsigned = false;
            else if (typeof object.winnerId === "string")
                message.winnerId = parseInt(object.winnerId, 10);
            else if (typeof object.winnerId === "number")
                message.winnerId = object.winnerId;
            else if (typeof object.winnerId === "object")
                message.winnerId = new $util.LongBits(object.winnerId.low >>> 0, object.winnerId.high >>> 0).toNumber();
        return message;
    };

    /**
     * Creates a plain object from a GPVPRefereeInfo message. Also converts values to other types if specified.
     * @function toObject
     * @memberof GPVPRefereeInfo
     * @static
     * @param {GPVPRefereeInfo} message GPVPRefereeInfo
     * @param {$protobuf.IConversionOptions} [options] Conversion options
     * @returns {Object.<string,*>} Plain object
     */
    GPVPRefereeInfo.toObject = function toObject(message, options) {
        if (!options)
            options = {};
        var object = {};
        if (options.defaults)
            if ($util.Long) {
                var long = new $util.Long(0, 0, false);
                object.winnerId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
            } else
                object.winnerId = options.longs === String ? "0" : 0;
        if (message.winnerId != null && message.hasOwnProperty("winnerId"))
            if (typeof message.winnerId === "number")
                object.winnerId = options.longs === String ? String(message.winnerId) : message.winnerId;
            else
                object.winnerId = options.longs === String ? $util.Long.prototype.toString.call(message.winnerId) : options.longs === Number ? new $util.LongBits(message.winnerId.low >>> 0, message.winnerId.high >>> 0).toNumber() : message.winnerId;
        return object;
    };

    /**
     * Converts this GPVPRefereeInfo to JSON.
     * @function toJSON
     * @memberof GPVPRefereeInfo
     * @instance
     * @returns {Object.<string,*>} JSON object
     */
    GPVPRefereeInfo.prototype.toJSON = function toJSON() {
        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
    };

    /**
     * Gets the default type url for GPVPRefereeInfo
     * @function getTypeUrl
     * @memberof GPVPRefereeInfo
     * @static
     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
     * @returns {string} The default type url
     */
    GPVPRefereeInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
        if (typeUrlPrefix === undefined) {
            typeUrlPrefix = "type.googleapis.com";
        }
        return typeUrlPrefix + "/GPVPRefereeInfo";
    };

    return GPVPRefereeInfo;
})();

$root.GUIChatMessage = (function() {

    /**
     * Properties of a GUIChatMessage.
     * @exports IGUIChatMessage
     * @interface IGUIChatMessage
     * @property {string|null} [message] GUIChatMessage message
     */

    /**
     * Constructs a new GUIChatMessage.
     * @exports GUIChatMessage
     * @classdesc Represents a GUIChatMessage.
     * @implements IGUIChatMessage
     * @constructor
     * @param {IGUIChatMessage=} [properties] Properties to set
     */
    function GUIChatMessage(properties) {
        if (properties)
            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                if (properties[keys[i]] != null)
                    this[keys[i]] = properties[keys[i]];
    }

    /**
     * GUIChatMessage message.
     * @member {string} message
     * @memberof GUIChatMessage
     * @instance
     */
    GUIChatMessage.prototype.message = "";

    /**
     * Creates a new GUIChatMessage instance using the specified properties.
     * @function create
     * @memberof GUIChatMessage
     * @static
     * @param {IGUIChatMessage=} [properties] Properties to set
     * @returns {GUIChatMessage} GUIChatMessage instance
     */
    GUIChatMessage.create = function create(properties) {
        return new GUIChatMessage(properties);
    };

    /**
     * Encodes the specified GUIChatMessage message. Does not implicitly {@link GUIChatMessage.verify|verify} messages.
     * @function encode
     * @memberof GUIChatMessage
     * @static
     * @param {IGUIChatMessage} message GUIChatMessage message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    GUIChatMessage.encode = function encode(message, writer) {
        if (!writer)
            writer = $Writer.create();
        if (message.message != null && Object.hasOwnProperty.call(message, "message"))
            writer.uint32(/* id 1, wireType 2 =*/10).string(message.message);
        return writer;
    };

    /**
     * Encodes the specified GUIChatMessage message, length delimited. Does not implicitly {@link GUIChatMessage.verify|verify} messages.
     * @function encodeDelimited
     * @memberof GUIChatMessage
     * @static
     * @param {IGUIChatMessage} message GUIChatMessage message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    GUIChatMessage.encodeDelimited = function encodeDelimited(message, writer) {
        return this.encode(message, writer).ldelim();
    };

    /**
     * Decodes a GUIChatMessage message from the specified reader or buffer.
     * @function decode
     * @memberof GUIChatMessage
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @param {number} [length] Message length if known beforehand
     * @returns {GUIChatMessage} GUIChatMessage
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    GUIChatMessage.decode = function decode(reader, length) {
        if (!(reader instanceof $Reader))
            reader = $Reader.create(reader);
        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.GUIChatMessage();
        while (reader.pos < end) {
            var tag = reader.uint32();
            switch (tag >>> 3) {
            case 1: {
                    message.message = reader.string();
                    break;
                }
            default:
                reader.skipType(tag & 7);
                break;
            }
        }
        return message;
    };

    /**
     * Decodes a GUIChatMessage message from the specified reader or buffer, length delimited.
     * @function decodeDelimited
     * @memberof GUIChatMessage
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @returns {GUIChatMessage} GUIChatMessage
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    GUIChatMessage.decodeDelimited = function decodeDelimited(reader) {
        if (!(reader instanceof $Reader))
            reader = new $Reader(reader);
        return this.decode(reader, reader.uint32());
    };

    /**
     * Verifies a GUIChatMessage message.
     * @function verify
     * @memberof GUIChatMessage
     * @static
     * @param {Object.<string,*>} message Plain object to verify
     * @returns {string|null} `null` if valid, otherwise the reason why it is not
     */
    GUIChatMessage.verify = function verify(message) {
        if (typeof message !== "object" || message === null)
            return "object expected";
        if (message.message != null && message.hasOwnProperty("message"))
            if (!$util.isString(message.message))
                return "message: string expected";
        return null;
    };

    /**
     * Creates a GUIChatMessage message from a plain object. Also converts values to their respective internal types.
     * @function fromObject
     * @memberof GUIChatMessage
     * @static
     * @param {Object.<string,*>} object Plain object
     * @returns {GUIChatMessage} GUIChatMessage
     */
    GUIChatMessage.fromObject = function fromObject(object) {
        if (object instanceof $root.GUIChatMessage)
            return object;
        var message = new $root.GUIChatMessage();
        if (object.message != null)
            message.message = String(object.message);
        return message;
    };

    /**
     * Creates a plain object from a GUIChatMessage message. Also converts values to other types if specified.
     * @function toObject
     * @memberof GUIChatMessage
     * @static
     * @param {GUIChatMessage} message GUIChatMessage
     * @param {$protobuf.IConversionOptions} [options] Conversion options
     * @returns {Object.<string,*>} Plain object
     */
    GUIChatMessage.toObject = function toObject(message, options) {
        if (!options)
            options = {};
        var object = {};
        if (options.defaults)
            object.message = "";
        if (message.message != null && message.hasOwnProperty("message"))
            object.message = message.message;
        return object;
    };

    /**
     * Converts this GUIChatMessage to JSON.
     * @function toJSON
     * @memberof GUIChatMessage
     * @instance
     * @returns {Object.<string,*>} JSON object
     */
    GUIChatMessage.prototype.toJSON = function toJSON() {
        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
    };

    /**
     * Gets the default type url for GUIChatMessage
     * @function getTypeUrl
     * @memberof GUIChatMessage
     * @static
     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
     * @returns {string} The default type url
     */
    GUIChatMessage.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
        if (typeUrlPrefix === undefined) {
            typeUrlPrefix = "type.googleapis.com";
        }
        return typeUrlPrefix + "/GUIChatMessage";
    };

    return GUIChatMessage;
})();

$root.GUIChatMessageDTO = (function() {

    /**
     * Properties of a GUIChatMessageDTO.
     * @exports IGUIChatMessageDTO
     * @interface IGUIChatMessageDTO
     * @property {IGUIChatMessage|null} [message] GUIChatMessageDTO message
     * @property {string|null} [playerName] GUIChatMessageDTO playerName
     * @property {number|Long|null} [playerId] GUIChatMessageDTO playerId
     */

    /**
     * Constructs a new GUIChatMessageDTO.
     * @exports GUIChatMessageDTO
     * @classdesc Represents a GUIChatMessageDTO.
     * @implements IGUIChatMessageDTO
     * @constructor
     * @param {IGUIChatMessageDTO=} [properties] Properties to set
     */
    function GUIChatMessageDTO(properties) {
        if (properties)
            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                if (properties[keys[i]] != null)
                    this[keys[i]] = properties[keys[i]];
    }

    /**
     * GUIChatMessageDTO message.
     * @member {IGUIChatMessage|null|undefined} message
     * @memberof GUIChatMessageDTO
     * @instance
     */
    GUIChatMessageDTO.prototype.message = null;

    /**
     * GUIChatMessageDTO playerName.
     * @member {string} playerName
     * @memberof GUIChatMessageDTO
     * @instance
     */
    GUIChatMessageDTO.prototype.playerName = "";

    /**
     * GUIChatMessageDTO playerId.
     * @member {number|Long} playerId
     * @memberof GUIChatMessageDTO
     * @instance
     */
    GUIChatMessageDTO.prototype.playerId = $util.Long ? $util.Long.fromBits(0,0,false) : 0;

    /**
     * Creates a new GUIChatMessageDTO instance using the specified properties.
     * @function create
     * @memberof GUIChatMessageDTO
     * @static
     * @param {IGUIChatMessageDTO=} [properties] Properties to set
     * @returns {GUIChatMessageDTO} GUIChatMessageDTO instance
     */
    GUIChatMessageDTO.create = function create(properties) {
        return new GUIChatMessageDTO(properties);
    };

    /**
     * Encodes the specified GUIChatMessageDTO message. Does not implicitly {@link GUIChatMessageDTO.verify|verify} messages.
     * @function encode
     * @memberof GUIChatMessageDTO
     * @static
     * @param {IGUIChatMessageDTO} message GUIChatMessageDTO message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    GUIChatMessageDTO.encode = function encode(message, writer) {
        if (!writer)
            writer = $Writer.create();
        if (message.message != null && Object.hasOwnProperty.call(message, "message"))
            $root.GUIChatMessage.encode(message.message, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
        if (message.playerName != null && Object.hasOwnProperty.call(message, "playerName"))
            writer.uint32(/* id 2, wireType 2 =*/18).string(message.playerName);
        if (message.playerId != null && Object.hasOwnProperty.call(message, "playerId"))
            writer.uint32(/* id 3, wireType 0 =*/24).int64(message.playerId);
        return writer;
    };

    /**
     * Encodes the specified GUIChatMessageDTO message, length delimited. Does not implicitly {@link GUIChatMessageDTO.verify|verify} messages.
     * @function encodeDelimited
     * @memberof GUIChatMessageDTO
     * @static
     * @param {IGUIChatMessageDTO} message GUIChatMessageDTO message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    GUIChatMessageDTO.encodeDelimited = function encodeDelimited(message, writer) {
        return this.encode(message, writer).ldelim();
    };

    /**
     * Decodes a GUIChatMessageDTO message from the specified reader or buffer.
     * @function decode
     * @memberof GUIChatMessageDTO
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @param {number} [length] Message length if known beforehand
     * @returns {GUIChatMessageDTO} GUIChatMessageDTO
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    GUIChatMessageDTO.decode = function decode(reader, length) {
        if (!(reader instanceof $Reader))
            reader = $Reader.create(reader);
        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.GUIChatMessageDTO();
        while (reader.pos < end) {
            var tag = reader.uint32();
            switch (tag >>> 3) {
            case 1: {
                    message.message = $root.GUIChatMessage.decode(reader, reader.uint32());
                    break;
                }
            case 2: {
                    message.playerName = reader.string();
                    break;
                }
            case 3: {
                    message.playerId = reader.int64();
                    break;
                }
            default:
                reader.skipType(tag & 7);
                break;
            }
        }
        return message;
    };

    /**
     * Decodes a GUIChatMessageDTO message from the specified reader or buffer, length delimited.
     * @function decodeDelimited
     * @memberof GUIChatMessageDTO
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @returns {GUIChatMessageDTO} GUIChatMessageDTO
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    GUIChatMessageDTO.decodeDelimited = function decodeDelimited(reader) {
        if (!(reader instanceof $Reader))
            reader = new $Reader(reader);
        return this.decode(reader, reader.uint32());
    };

    /**
     * Verifies a GUIChatMessageDTO message.
     * @function verify
     * @memberof GUIChatMessageDTO
     * @static
     * @param {Object.<string,*>} message Plain object to verify
     * @returns {string|null} `null` if valid, otherwise the reason why it is not
     */
    GUIChatMessageDTO.verify = function verify(message) {
        if (typeof message !== "object" || message === null)
            return "object expected";
        if (message.message != null && message.hasOwnProperty("message")) {
            var error = $root.GUIChatMessage.verify(message.message);
            if (error)
                return "message." + error;
        }
        if (message.playerName != null && message.hasOwnProperty("playerName"))
            if (!$util.isString(message.playerName))
                return "playerName: string expected";
        if (message.playerId != null && message.hasOwnProperty("playerId"))
            if (!$util.isInteger(message.playerId) && !(message.playerId && $util.isInteger(message.playerId.low) && $util.isInteger(message.playerId.high)))
                return "playerId: integer|Long expected";
        return null;
    };

    /**
     * Creates a GUIChatMessageDTO message from a plain object. Also converts values to their respective internal types.
     * @function fromObject
     * @memberof GUIChatMessageDTO
     * @static
     * @param {Object.<string,*>} object Plain object
     * @returns {GUIChatMessageDTO} GUIChatMessageDTO
     */
    GUIChatMessageDTO.fromObject = function fromObject(object) {
        if (object instanceof $root.GUIChatMessageDTO)
            return object;
        var message = new $root.GUIChatMessageDTO();
        if (object.message != null) {
            if (typeof object.message !== "object")
                throw TypeError(".GUIChatMessageDTO.message: object expected");
            message.message = $root.GUIChatMessage.fromObject(object.message);
        }
        if (object.playerName != null)
            message.playerName = String(object.playerName);
        if (object.playerId != null)
            if ($util.Long)
                (message.playerId = $util.Long.fromValue(object.playerId)).unsigned = false;
            else if (typeof object.playerId === "string")
                message.playerId = parseInt(object.playerId, 10);
            else if (typeof object.playerId === "number")
                message.playerId = object.playerId;
            else if (typeof object.playerId === "object")
                message.playerId = new $util.LongBits(object.playerId.low >>> 0, object.playerId.high >>> 0).toNumber();
        return message;
    };

    /**
     * Creates a plain object from a GUIChatMessageDTO message. Also converts values to other types if specified.
     * @function toObject
     * @memberof GUIChatMessageDTO
     * @static
     * @param {GUIChatMessageDTO} message GUIChatMessageDTO
     * @param {$protobuf.IConversionOptions} [options] Conversion options
     * @returns {Object.<string,*>} Plain object
     */
    GUIChatMessageDTO.toObject = function toObject(message, options) {
        if (!options)
            options = {};
        var object = {};
        if (options.defaults) {
            object.message = null;
            object.playerName = "";
            if ($util.Long) {
                var long = new $util.Long(0, 0, false);
                object.playerId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
            } else
                object.playerId = options.longs === String ? "0" : 0;
        }
        if (message.message != null && message.hasOwnProperty("message"))
            object.message = $root.GUIChatMessage.toObject(message.message, options);
        if (message.playerName != null && message.hasOwnProperty("playerName"))
            object.playerName = message.playerName;
        if (message.playerId != null && message.hasOwnProperty("playerId"))
            if (typeof message.playerId === "number")
                object.playerId = options.longs === String ? String(message.playerId) : message.playerId;
            else
                object.playerId = options.longs === String ? $util.Long.prototype.toString.call(message.playerId) : options.longs === Number ? new $util.LongBits(message.playerId.low >>> 0, message.playerId.high >>> 0).toNumber() : message.playerId;
        return object;
    };

    /**
     * Converts this GUIChatMessageDTO to JSON.
     * @function toJSON
     * @memberof GUIChatMessageDTO
     * @instance
     * @returns {Object.<string,*>} JSON object
     */
    GUIChatMessageDTO.prototype.toJSON = function toJSON() {
        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
    };

    /**
     * Gets the default type url for GUIChatMessageDTO
     * @function getTypeUrl
     * @memberof GUIChatMessageDTO
     * @static
     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
     * @returns {string} The default type url
     */
    GUIChatMessageDTO.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
        if (typeUrlPrefix === undefined) {
            typeUrlPrefix = "type.googleapis.com";
        }
        return typeUrlPrefix + "/GUIChatMessageDTO";
    };

    return GUIChatMessageDTO;
})();

$root.JNFrameInput = (function() {

    /**
     * Properties of a JNFrameInput.
     * @exports IJNFrameInput
     * @interface IJNFrameInput
     * @property {number|null} [nId] JNFrameInput nId
     * @property {Uint8Array|null} [input] JNFrameInput input
     */

    /**
     * Constructs a new JNFrameInput.
     * @exports JNFrameInput
     * @classdesc Represents a JNFrameInput.
     * @implements IJNFrameInput
     * @constructor
     * @param {IJNFrameInput=} [properties] Properties to set
     */
    function JNFrameInput(properties) {
        if (properties)
            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                if (properties[keys[i]] != null)
                    this[keys[i]] = properties[keys[i]];
    }

    /**
     * JNFrameInput nId.
     * @member {number} nId
     * @memberof JNFrameInput
     * @instance
     */
    JNFrameInput.prototype.nId = 0;

    /**
     * JNFrameInput input.
     * @member {Uint8Array|null|undefined} input
     * @memberof JNFrameInput
     * @instance
     */
    JNFrameInput.prototype.input = null;

    // OneOf field names bound to virtual getters and setters
    var $oneOfFields;

    /**
     * JNFrameInput _input.
     * @member {"input"|undefined} _input
     * @memberof JNFrameInput
     * @instance
     */
    Object.defineProperty(JNFrameInput.prototype, "_input", {
        get: $util.oneOfGetter($oneOfFields = ["input"]),
        set: $util.oneOfSetter($oneOfFields)
    });

    /**
     * Creates a new JNFrameInput instance using the specified properties.
     * @function create
     * @memberof JNFrameInput
     * @static
     * @param {IJNFrameInput=} [properties] Properties to set
     * @returns {JNFrameInput} JNFrameInput instance
     */
    JNFrameInput.create = function create(properties) {
        return new JNFrameInput(properties);
    };

    /**
     * Encodes the specified JNFrameInput message. Does not implicitly {@link JNFrameInput.verify|verify} messages.
     * @function encode
     * @memberof JNFrameInput
     * @static
     * @param {IJNFrameInput} message JNFrameInput message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    JNFrameInput.encode = function encode(message, writer) {
        if (!writer)
            writer = $Writer.create();
        if (message.nId != null && Object.hasOwnProperty.call(message, "nId"))
            writer.uint32(/* id 1, wireType 0 =*/8).int32(message.nId);
        if (message.input != null && Object.hasOwnProperty.call(message, "input"))
            writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.input);
        return writer;
    };

    /**
     * Encodes the specified JNFrameInput message, length delimited. Does not implicitly {@link JNFrameInput.verify|verify} messages.
     * @function encodeDelimited
     * @memberof JNFrameInput
     * @static
     * @param {IJNFrameInput} message JNFrameInput message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    JNFrameInput.encodeDelimited = function encodeDelimited(message, writer) {
        return this.encode(message, writer).ldelim();
    };

    /**
     * Decodes a JNFrameInput message from the specified reader or buffer.
     * @function decode
     * @memberof JNFrameInput
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @param {number} [length] Message length if known beforehand
     * @returns {JNFrameInput} JNFrameInput
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    JNFrameInput.decode = function decode(reader, length) {
        if (!(reader instanceof $Reader))
            reader = $Reader.create(reader);
        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.JNFrameInput();
        while (reader.pos < end) {
            var tag = reader.uint32();
            switch (tag >>> 3) {
            case 1: {
                    message.nId = reader.int32();
                    break;
                }
            case 2: {
                    message.input = reader.bytes();
                    break;
                }
            default:
                reader.skipType(tag & 7);
                break;
            }
        }
        return message;
    };

    /**
     * Decodes a JNFrameInput message from the specified reader or buffer, length delimited.
     * @function decodeDelimited
     * @memberof JNFrameInput
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @returns {JNFrameInput} JNFrameInput
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    JNFrameInput.decodeDelimited = function decodeDelimited(reader) {
        if (!(reader instanceof $Reader))
            reader = new $Reader(reader);
        return this.decode(reader, reader.uint32());
    };

    /**
     * Verifies a JNFrameInput message.
     * @function verify
     * @memberof JNFrameInput
     * @static
     * @param {Object.<string,*>} message Plain object to verify
     * @returns {string|null} `null` if valid, otherwise the reason why it is not
     */
    JNFrameInput.verify = function verify(message) {
        if (typeof message !== "object" || message === null)
            return "object expected";
        var properties = {};
        if (message.nId != null && message.hasOwnProperty("nId"))
            if (!$util.isInteger(message.nId))
                return "nId: integer expected";
        if (message.input != null && message.hasOwnProperty("input")) {
            properties._input = 1;
            if (!(message.input && typeof message.input.length === "number" || $util.isString(message.input)))
                return "input: buffer expected";
        }
        return null;
    };

    /**
     * Creates a JNFrameInput message from a plain object. Also converts values to their respective internal types.
     * @function fromObject
     * @memberof JNFrameInput
     * @static
     * @param {Object.<string,*>} object Plain object
     * @returns {JNFrameInput} JNFrameInput
     */
    JNFrameInput.fromObject = function fromObject(object) {
        if (object instanceof $root.JNFrameInput)
            return object;
        var message = new $root.JNFrameInput();
        if (object.nId != null)
            message.nId = object.nId | 0;
        if (object.input != null)
            if (typeof object.input === "string")
                $util.base64.decode(object.input, message.input = $util.newBuffer($util.base64.length(object.input)), 0);
            else if (object.input.length >= 0)
                message.input = object.input;
        return message;
    };

    /**
     * Creates a plain object from a JNFrameInput message. Also converts values to other types if specified.
     * @function toObject
     * @memberof JNFrameInput
     * @static
     * @param {JNFrameInput} message JNFrameInput
     * @param {$protobuf.IConversionOptions} [options] Conversion options
     * @returns {Object.<string,*>} Plain object
     */
    JNFrameInput.toObject = function toObject(message, options) {
        if (!options)
            options = {};
        var object = {};
        if (options.defaults)
            object.nId = 0;
        if (message.nId != null && message.hasOwnProperty("nId"))
            object.nId = message.nId;
        if (message.input != null && message.hasOwnProperty("input")) {
            object.input = options.bytes === String ? $util.base64.encode(message.input, 0, message.input.length) : options.bytes === Array ? Array.prototype.slice.call(message.input) : message.input;
            if (options.oneofs)
                object._input = "input";
        }
        return object;
    };

    /**
     * Converts this JNFrameInput to JSON.
     * @function toJSON
     * @memberof JNFrameInput
     * @instance
     * @returns {Object.<string,*>} JSON object
     */
    JNFrameInput.prototype.toJSON = function toJSON() {
        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
    };

    /**
     * Gets the default type url for JNFrameInput
     * @function getTypeUrl
     * @memberof JNFrameInput
     * @static
     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
     * @returns {string} The default type url
     */
    JNFrameInput.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
        if (typeUrlPrefix === undefined) {
            typeUrlPrefix = "type.googleapis.com";
        }
        return typeUrlPrefix + "/JNFrameInput";
    };

    return JNFrameInput;
})();

$root.JNFrameInputs = (function() {

    /**
     * Properties of a JNFrameInputs.
     * @exports IJNFrameInputs
     * @interface IJNFrameInputs
     * @property {Array.<IJNFrameInput>|null} [inputs] JNFrameInputs inputs
     */

    /**
     * Constructs a new JNFrameInputs.
     * @exports JNFrameInputs
     * @classdesc Represents a JNFrameInputs.
     * @implements IJNFrameInputs
     * @constructor
     * @param {IJNFrameInputs=} [properties] Properties to set
     */
    function JNFrameInputs(properties) {
        this.inputs = [];
        if (properties)
            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                if (properties[keys[i]] != null)
                    this[keys[i]] = properties[keys[i]];
    }

    /**
     * JNFrameInputs inputs.
     * @member {Array.<IJNFrameInput>} inputs
     * @memberof JNFrameInputs
     * @instance
     */
    JNFrameInputs.prototype.inputs = $util.emptyArray;

    /**
     * Creates a new JNFrameInputs instance using the specified properties.
     * @function create
     * @memberof JNFrameInputs
     * @static
     * @param {IJNFrameInputs=} [properties] Properties to set
     * @returns {JNFrameInputs} JNFrameInputs instance
     */
    JNFrameInputs.create = function create(properties) {
        return new JNFrameInputs(properties);
    };

    /**
     * Encodes the specified JNFrameInputs message. Does not implicitly {@link JNFrameInputs.verify|verify} messages.
     * @function encode
     * @memberof JNFrameInputs
     * @static
     * @param {IJNFrameInputs} message JNFrameInputs message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    JNFrameInputs.encode = function encode(message, writer) {
        if (!writer)
            writer = $Writer.create();
        if (message.inputs != null && message.inputs.length)
            for (var i = 0; i < message.inputs.length; ++i)
                $root.JNFrameInput.encode(message.inputs[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
        return writer;
    };

    /**
     * Encodes the specified JNFrameInputs message, length delimited. Does not implicitly {@link JNFrameInputs.verify|verify} messages.
     * @function encodeDelimited
     * @memberof JNFrameInputs
     * @static
     * @param {IJNFrameInputs} message JNFrameInputs message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    JNFrameInputs.encodeDelimited = function encodeDelimited(message, writer) {
        return this.encode(message, writer).ldelim();
    };

    /**
     * Decodes a JNFrameInputs message from the specified reader or buffer.
     * @function decode
     * @memberof JNFrameInputs
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @param {number} [length] Message length if known beforehand
     * @returns {JNFrameInputs} JNFrameInputs
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    JNFrameInputs.decode = function decode(reader, length) {
        if (!(reader instanceof $Reader))
            reader = $Reader.create(reader);
        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.JNFrameInputs();
        while (reader.pos < end) {
            var tag = reader.uint32();
            switch (tag >>> 3) {
            case 1: {
                    if (!(message.inputs && message.inputs.length))
                        message.inputs = [];
                    message.inputs.push($root.JNFrameInput.decode(reader, reader.uint32()));
                    break;
                }
            default:
                reader.skipType(tag & 7);
                break;
            }
        }
        return message;
    };

    /**
     * Decodes a JNFrameInputs message from the specified reader or buffer, length delimited.
     * @function decodeDelimited
     * @memberof JNFrameInputs
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @returns {JNFrameInputs} JNFrameInputs
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    JNFrameInputs.decodeDelimited = function decodeDelimited(reader) {
        if (!(reader instanceof $Reader))
            reader = new $Reader(reader);
        return this.decode(reader, reader.uint32());
    };

    /**
     * Verifies a JNFrameInputs message.
     * @function verify
     * @memberof JNFrameInputs
     * @static
     * @param {Object.<string,*>} message Plain object to verify
     * @returns {string|null} `null` if valid, otherwise the reason why it is not
     */
    JNFrameInputs.verify = function verify(message) {
        if (typeof message !== "object" || message === null)
            return "object expected";
        if (message.inputs != null && message.hasOwnProperty("inputs")) {
            if (!Array.isArray(message.inputs))
                return "inputs: array expected";
            for (var i = 0; i < message.inputs.length; ++i) {
                var error = $root.JNFrameInput.verify(message.inputs[i]);
                if (error)
                    return "inputs." + error;
            }
        }
        return null;
    };

    /**
     * Creates a JNFrameInputs message from a plain object. Also converts values to their respective internal types.
     * @function fromObject
     * @memberof JNFrameInputs
     * @static
     * @param {Object.<string,*>} object Plain object
     * @returns {JNFrameInputs} JNFrameInputs
     */
    JNFrameInputs.fromObject = function fromObject(object) {
        if (object instanceof $root.JNFrameInputs)
            return object;
        var message = new $root.JNFrameInputs();
        if (object.inputs) {
            if (!Array.isArray(object.inputs))
                throw TypeError(".JNFrameInputs.inputs: array expected");
            message.inputs = [];
            for (var i = 0; i < object.inputs.length; ++i) {
                if (typeof object.inputs[i] !== "object")
                    throw TypeError(".JNFrameInputs.inputs: object expected");
                message.inputs[i] = $root.JNFrameInput.fromObject(object.inputs[i]);
            }
        }
        return message;
    };

    /**
     * Creates a plain object from a JNFrameInputs message. Also converts values to other types if specified.
     * @function toObject
     * @memberof JNFrameInputs
     * @static
     * @param {JNFrameInputs} message JNFrameInputs
     * @param {$protobuf.IConversionOptions} [options] Conversion options
     * @returns {Object.<string,*>} Plain object
     */
    JNFrameInputs.toObject = function toObject(message, options) {
        if (!options)
            options = {};
        var object = {};
        if (options.arrays || options.defaults)
            object.inputs = [];
        if (message.inputs && message.inputs.length) {
            object.inputs = [];
            for (var j = 0; j < message.inputs.length; ++j)
                object.inputs[j] = $root.JNFrameInput.toObject(message.inputs[j], options);
        }
        return object;
    };

    /**
     * Converts this JNFrameInputs to JSON.
     * @function toJSON
     * @memberof JNFrameInputs
     * @instance
     * @returns {Object.<string,*>} JSON object
     */
    JNFrameInputs.prototype.toJSON = function toJSON() {
        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
    };

    /**
     * Gets the default type url for JNFrameInputs
     * @function getTypeUrl
     * @memberof JNFrameInputs
     * @static
     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
     * @returns {string} The default type url
     */
    JNFrameInputs.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
        if (typeUrlPrefix === undefined) {
            typeUrlPrefix = "type.googleapis.com";
        }
        return typeUrlPrefix + "/JNFrameInputs";
    };

    return JNFrameInputs;
})();

$root.JNFrameInfo = (function() {

    /**
     * Properties of a JNFrameInfo.
     * @exports IJNFrameInfo
     * @interface IJNFrameInfo
     * @property {number|null} [index] JNFrameInfo index
     * @property {Array.<IJNFrameInput>|null} [messages] JNFrameInfo messages
     */

    /**
     * Constructs a new JNFrameInfo.
     * @exports JNFrameInfo
     * @classdesc Represents a JNFrameInfo.
     * @implements IJNFrameInfo
     * @constructor
     * @param {IJNFrameInfo=} [properties] Properties to set
     */
    function JNFrameInfo(properties) {
        this.messages = [];
        if (properties)
            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                if (properties[keys[i]] != null)
                    this[keys[i]] = properties[keys[i]];
    }

    /**
     * JNFrameInfo index.
     * @member {number} index
     * @memberof JNFrameInfo
     * @instance
     */
    JNFrameInfo.prototype.index = 0;

    /**
     * JNFrameInfo messages.
     * @member {Array.<IJNFrameInput>} messages
     * @memberof JNFrameInfo
     * @instance
     */
    JNFrameInfo.prototype.messages = $util.emptyArray;

    /**
     * Creates a new JNFrameInfo instance using the specified properties.
     * @function create
     * @memberof JNFrameInfo
     * @static
     * @param {IJNFrameInfo=} [properties] Properties to set
     * @returns {JNFrameInfo} JNFrameInfo instance
     */
    JNFrameInfo.create = function create(properties) {
        return new JNFrameInfo(properties);
    };

    /**
     * Encodes the specified JNFrameInfo message. Does not implicitly {@link JNFrameInfo.verify|verify} messages.
     * @function encode
     * @memberof JNFrameInfo
     * @static
     * @param {IJNFrameInfo} message JNFrameInfo message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    JNFrameInfo.encode = function encode(message, writer) {
        if (!writer)
            writer = $Writer.create();
        if (message.index != null && Object.hasOwnProperty.call(message, "index"))
            writer.uint32(/* id 1, wireType 0 =*/8).int32(message.index);
        if (message.messages != null && message.messages.length)
            for (var i = 0; i < message.messages.length; ++i)
                $root.JNFrameInput.encode(message.messages[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
        return writer;
    };

    /**
     * Encodes the specified JNFrameInfo message, length delimited. Does not implicitly {@link JNFrameInfo.verify|verify} messages.
     * @function encodeDelimited
     * @memberof JNFrameInfo
     * @static
     * @param {IJNFrameInfo} message JNFrameInfo message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    JNFrameInfo.encodeDelimited = function encodeDelimited(message, writer) {
        return this.encode(message, writer).ldelim();
    };

    /**
     * Decodes a JNFrameInfo message from the specified reader or buffer.
     * @function decode
     * @memberof JNFrameInfo
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @param {number} [length] Message length if known beforehand
     * @returns {JNFrameInfo} JNFrameInfo
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    JNFrameInfo.decode = function decode(reader, length) {
        if (!(reader instanceof $Reader))
            reader = $Reader.create(reader);
        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.JNFrameInfo();
        while (reader.pos < end) {
            var tag = reader.uint32();
            switch (tag >>> 3) {
            case 1: {
                    message.index = reader.int32();
                    break;
                }
            case 2: {
                    if (!(message.messages && message.messages.length))
                        message.messages = [];
                    message.messages.push($root.JNFrameInput.decode(reader, reader.uint32()));
                    break;
                }
            default:
                reader.skipType(tag & 7);
                break;
            }
        }
        return message;
    };

    /**
     * Decodes a JNFrameInfo message from the specified reader or buffer, length delimited.
     * @function decodeDelimited
     * @memberof JNFrameInfo
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @returns {JNFrameInfo} JNFrameInfo
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    JNFrameInfo.decodeDelimited = function decodeDelimited(reader) {
        if (!(reader instanceof $Reader))
            reader = new $Reader(reader);
        return this.decode(reader, reader.uint32());
    };

    /**
     * Verifies a JNFrameInfo message.
     * @function verify
     * @memberof JNFrameInfo
     * @static
     * @param {Object.<string,*>} message Plain object to verify
     * @returns {string|null} `null` if valid, otherwise the reason why it is not
     */
    JNFrameInfo.verify = function verify(message) {
        if (typeof message !== "object" || message === null)
            return "object expected";
        if (message.index != null && message.hasOwnProperty("index"))
            if (!$util.isInteger(message.index))
                return "index: integer expected";
        if (message.messages != null && message.hasOwnProperty("messages")) {
            if (!Array.isArray(message.messages))
                return "messages: array expected";
            for (var i = 0; i < message.messages.length; ++i) {
                var error = $root.JNFrameInput.verify(message.messages[i]);
                if (error)
                    return "messages." + error;
            }
        }
        return null;
    };

    /**
     * Creates a JNFrameInfo message from a plain object. Also converts values to their respective internal types.
     * @function fromObject
     * @memberof JNFrameInfo
     * @static
     * @param {Object.<string,*>} object Plain object
     * @returns {JNFrameInfo} JNFrameInfo
     */
    JNFrameInfo.fromObject = function fromObject(object) {
        if (object instanceof $root.JNFrameInfo)
            return object;
        var message = new $root.JNFrameInfo();
        if (object.index != null)
            message.index = object.index | 0;
        if (object.messages) {
            if (!Array.isArray(object.messages))
                throw TypeError(".JNFrameInfo.messages: array expected");
            message.messages = [];
            for (var i = 0; i < object.messages.length; ++i) {
                if (typeof object.messages[i] !== "object")
                    throw TypeError(".JNFrameInfo.messages: object expected");
                message.messages[i] = $root.JNFrameInput.fromObject(object.messages[i]);
            }
        }
        return message;
    };

    /**
     * Creates a plain object from a JNFrameInfo message. Also converts values to other types if specified.
     * @function toObject
     * @memberof JNFrameInfo
     * @static
     * @param {JNFrameInfo} message JNFrameInfo
     * @param {$protobuf.IConversionOptions} [options] Conversion options
     * @returns {Object.<string,*>} Plain object
     */
    JNFrameInfo.toObject = function toObject(message, options) {
        if (!options)
            options = {};
        var object = {};
        if (options.arrays || options.defaults)
            object.messages = [];
        if (options.defaults)
            object.index = 0;
        if (message.index != null && message.hasOwnProperty("index"))
            object.index = message.index;
        if (message.messages && message.messages.length) {
            object.messages = [];
            for (var j = 0; j < message.messages.length; ++j)
                object.messages[j] = $root.JNFrameInput.toObject(message.messages[j], options);
        }
        return object;
    };

    /**
     * Converts this JNFrameInfo to JSON.
     * @function toJSON
     * @memberof JNFrameInfo
     * @instance
     * @returns {Object.<string,*>} JSON object
     */
    JNFrameInfo.prototype.toJSON = function toJSON() {
        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
    };

    /**
     * Gets the default type url for JNFrameInfo
     * @function getTypeUrl
     * @memberof JNFrameInfo
     * @static
     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
     * @returns {string} The default type url
     */
    JNFrameInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
        if (typeUrlPrefix === undefined) {
            typeUrlPrefix = "type.googleapis.com";
        }
        return typeUrlPrefix + "/JNFrameInfo";
    };

    return JNFrameInfo;
})();

$root.JNFrameInfos = (function() {

    /**
     * Properties of a JNFrameInfos.
     * @exports IJNFrameInfos
     * @interface IJNFrameInfos
     * @property {Array.<IJNFrameInfo>|null} [frames] JNFrameInfos frames
     */

    /**
     * Constructs a new JNFrameInfos.
     * @exports JNFrameInfos
     * @classdesc Represents a JNFrameInfos.
     * @implements IJNFrameInfos
     * @constructor
     * @param {IJNFrameInfos=} [properties] Properties to set
     */
    function JNFrameInfos(properties) {
        this.frames = [];
        if (properties)
            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                if (properties[keys[i]] != null)
                    this[keys[i]] = properties[keys[i]];
    }

    /**
     * JNFrameInfos frames.
     * @member {Array.<IJNFrameInfo>} frames
     * @memberof JNFrameInfos
     * @instance
     */
    JNFrameInfos.prototype.frames = $util.emptyArray;

    /**
     * Creates a new JNFrameInfos instance using the specified properties.
     * @function create
     * @memberof JNFrameInfos
     * @static
     * @param {IJNFrameInfos=} [properties] Properties to set
     * @returns {JNFrameInfos} JNFrameInfos instance
     */
    JNFrameInfos.create = function create(properties) {
        return new JNFrameInfos(properties);
    };

    /**
     * Encodes the specified JNFrameInfos message. Does not implicitly {@link JNFrameInfos.verify|verify} messages.
     * @function encode
     * @memberof JNFrameInfos
     * @static
     * @param {IJNFrameInfos} message JNFrameInfos message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    JNFrameInfos.encode = function encode(message, writer) {
        if (!writer)
            writer = $Writer.create();
        if (message.frames != null && message.frames.length)
            for (var i = 0; i < message.frames.length; ++i)
                $root.JNFrameInfo.encode(message.frames[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
        return writer;
    };

    /**
     * Encodes the specified JNFrameInfos message, length delimited. Does not implicitly {@link JNFrameInfos.verify|verify} messages.
     * @function encodeDelimited
     * @memberof JNFrameInfos
     * @static
     * @param {IJNFrameInfos} message JNFrameInfos message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    JNFrameInfos.encodeDelimited = function encodeDelimited(message, writer) {
        return this.encode(message, writer).ldelim();
    };

    /**
     * Decodes a JNFrameInfos message from the specified reader or buffer.
     * @function decode
     * @memberof JNFrameInfos
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @param {number} [length] Message length if known beforehand
     * @returns {JNFrameInfos} JNFrameInfos
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    JNFrameInfos.decode = function decode(reader, length) {
        if (!(reader instanceof $Reader))
            reader = $Reader.create(reader);
        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.JNFrameInfos();
        while (reader.pos < end) {
            var tag = reader.uint32();
            switch (tag >>> 3) {
            case 1: {
                    if (!(message.frames && message.frames.length))
                        message.frames = [];
                    message.frames.push($root.JNFrameInfo.decode(reader, reader.uint32()));
                    break;
                }
            default:
                reader.skipType(tag & 7);
                break;
            }
        }
        return message;
    };

    /**
     * Decodes a JNFrameInfos message from the specified reader or buffer, length delimited.
     * @function decodeDelimited
     * @memberof JNFrameInfos
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @returns {JNFrameInfos} JNFrameInfos
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    JNFrameInfos.decodeDelimited = function decodeDelimited(reader) {
        if (!(reader instanceof $Reader))
            reader = new $Reader(reader);
        return this.decode(reader, reader.uint32());
    };

    /**
     * Verifies a JNFrameInfos message.
     * @function verify
     * @memberof JNFrameInfos
     * @static
     * @param {Object.<string,*>} message Plain object to verify
     * @returns {string|null} `null` if valid, otherwise the reason why it is not
     */
    JNFrameInfos.verify = function verify(message) {
        if (typeof message !== "object" || message === null)
            return "object expected";
        if (message.frames != null && message.hasOwnProperty("frames")) {
            if (!Array.isArray(message.frames))
                return "frames: array expected";
            for (var i = 0; i < message.frames.length; ++i) {
                var error = $root.JNFrameInfo.verify(message.frames[i]);
                if (error)
                    return "frames." + error;
            }
        }
        return null;
    };

    /**
     * Creates a JNFrameInfos message from a plain object. Also converts values to their respective internal types.
     * @function fromObject
     * @memberof JNFrameInfos
     * @static
     * @param {Object.<string,*>} object Plain object
     * @returns {JNFrameInfos} JNFrameInfos
     */
    JNFrameInfos.fromObject = function fromObject(object) {
        if (object instanceof $root.JNFrameInfos)
            return object;
        var message = new $root.JNFrameInfos();
        if (object.frames) {
            if (!Array.isArray(object.frames))
                throw TypeError(".JNFrameInfos.frames: array expected");
            message.frames = [];
            for (var i = 0; i < object.frames.length; ++i) {
                if (typeof object.frames[i] !== "object")
                    throw TypeError(".JNFrameInfos.frames: object expected");
                message.frames[i] = $root.JNFrameInfo.fromObject(object.frames[i]);
            }
        }
        return message;
    };

    /**
     * Creates a plain object from a JNFrameInfos message. Also converts values to other types if specified.
     * @function toObject
     * @memberof JNFrameInfos
     * @static
     * @param {JNFrameInfos} message JNFrameInfos
     * @param {$protobuf.IConversionOptions} [options] Conversion options
     * @returns {Object.<string,*>} Plain object
     */
    JNFrameInfos.toObject = function toObject(message, options) {
        if (!options)
            options = {};
        var object = {};
        if (options.arrays || options.defaults)
            object.frames = [];
        if (message.frames && message.frames.length) {
            object.frames = [];
            for (var j = 0; j < message.frames.length; ++j)
                object.frames[j] = $root.JNFrameInfo.toObject(message.frames[j], options);
        }
        return object;
    };

    /**
     * Converts this JNFrameInfos to JSON.
     * @function toJSON
     * @memberof JNFrameInfos
     * @instance
     * @returns {Object.<string,*>} JSON object
     */
    JNFrameInfos.prototype.toJSON = function toJSON() {
        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
    };

    /**
     * Gets the default type url for JNFrameInfos
     * @function getTypeUrl
     * @memberof JNFrameInfos
     * @static
     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
     * @returns {string} The default type url
     */
    JNFrameInfos.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
        if (typeUrlPrefix === undefined) {
            typeUrlPrefix = "type.googleapis.com";
        }
        return typeUrlPrefix + "/JNFrameInfos";
    };

    return JNFrameInfos;
})();

$root.JNInput = (function() {

    /**
     * Properties of a JNInput.
     * @exports IJNInput
     * @interface IJNInput
     * @property {string|null} [message] JNInput message
     */

    /**
     * Constructs a new JNInput.
     * @exports JNInput
     * @classdesc Represents a JNInput.
     * @implements IJNInput
     * @constructor
     * @param {IJNInput=} [properties] Properties to set
     */
    function JNInput(properties) {
        if (properties)
            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                if (properties[keys[i]] != null)
                    this[keys[i]] = properties[keys[i]];
    }

    /**
     * JNInput message.
     * @member {string|null|undefined} message
     * @memberof JNInput
     * @instance
     */
    JNInput.prototype.message = null;

    // OneOf field names bound to virtual getters and setters
    var $oneOfFields;

    /**
     * JNInput _message.
     * @member {"message"|undefined} _message
     * @memberof JNInput
     * @instance
     */
    Object.defineProperty(JNInput.prototype, "_message", {
        get: $util.oneOfGetter($oneOfFields = ["message"]),
        set: $util.oneOfSetter($oneOfFields)
    });

    /**
     * Creates a new JNInput instance using the specified properties.
     * @function create
     * @memberof JNInput
     * @static
     * @param {IJNInput=} [properties] Properties to set
     * @returns {JNInput} JNInput instance
     */
    JNInput.create = function create(properties) {
        return new JNInput(properties);
    };

    /**
     * Encodes the specified JNInput message. Does not implicitly {@link JNInput.verify|verify} messages.
     * @function encode
     * @memberof JNInput
     * @static
     * @param {IJNInput} message JNInput message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    JNInput.encode = function encode(message, writer) {
        if (!writer)
            writer = $Writer.create();
        if (message.message != null && Object.hasOwnProperty.call(message, "message"))
            writer.uint32(/* id 1, wireType 2 =*/10).string(message.message);
        return writer;
    };

    /**
     * Encodes the specified JNInput message, length delimited. Does not implicitly {@link JNInput.verify|verify} messages.
     * @function encodeDelimited
     * @memberof JNInput
     * @static
     * @param {IJNInput} message JNInput message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    JNInput.encodeDelimited = function encodeDelimited(message, writer) {
        return this.encode(message, writer).ldelim();
    };

    /**
     * Decodes a JNInput message from the specified reader or buffer.
     * @function decode
     * @memberof JNInput
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @param {number} [length] Message length if known beforehand
     * @returns {JNInput} JNInput
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    JNInput.decode = function decode(reader, length) {
        if (!(reader instanceof $Reader))
            reader = $Reader.create(reader);
        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.JNInput();
        while (reader.pos < end) {
            var tag = reader.uint32();
            switch (tag >>> 3) {
            case 1: {
                    message.message = reader.string();
                    break;
                }
            default:
                reader.skipType(tag & 7);
                break;
            }
        }
        return message;
    };

    /**
     * Decodes a JNInput message from the specified reader or buffer, length delimited.
     * @function decodeDelimited
     * @memberof JNInput
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @returns {JNInput} JNInput
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    JNInput.decodeDelimited = function decodeDelimited(reader) {
        if (!(reader instanceof $Reader))
            reader = new $Reader(reader);
        return this.decode(reader, reader.uint32());
    };

    /**
     * Verifies a JNInput message.
     * @function verify
     * @memberof JNInput
     * @static
     * @param {Object.<string,*>} message Plain object to verify
     * @returns {string|null} `null` if valid, otherwise the reason why it is not
     */
    JNInput.verify = function verify(message) {
        if (typeof message !== "object" || message === null)
            return "object expected";
        var properties = {};
        if (message.message != null && message.hasOwnProperty("message")) {
            properties._message = 1;
            if (!$util.isString(message.message))
                return "message: string expected";
        }
        return null;
    };

    /**
     * Creates a JNInput message from a plain object. Also converts values to their respective internal types.
     * @function fromObject
     * @memberof JNInput
     * @static
     * @param {Object.<string,*>} object Plain object
     * @returns {JNInput} JNInput
     */
    JNInput.fromObject = function fromObject(object) {
        if (object instanceof $root.JNInput)
            return object;
        var message = new $root.JNInput();
        if (object.message != null)
            message.message = String(object.message);
        return message;
    };

    /**
     * Creates a plain object from a JNInput message. Also converts values to other types if specified.
     * @function toObject
     * @memberof JNInput
     * @static
     * @param {JNInput} message JNInput
     * @param {$protobuf.IConversionOptions} [options] Conversion options
     * @returns {Object.<string,*>} Plain object
     */
    JNInput.toObject = function toObject(message, options) {
        if (!options)
            options = {};
        var object = {};
        if (message.message != null && message.hasOwnProperty("message")) {
            object.message = message.message;
            if (options.oneofs)
                object._message = "message";
        }
        return object;
    };

    /**
     * Converts this JNInput to JSON.
     * @function toJSON
     * @memberof JNInput
     * @instance
     * @returns {Object.<string,*>} JSON object
     */
    JNInput.prototype.toJSON = function toJSON() {
        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
    };

    /**
     * Gets the default type url for JNInput
     * @function getTypeUrl
     * @memberof JNInput
     * @static
     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
     * @returns {string} The default type url
     */
    JNInput.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
        if (typeUrlPrefix === undefined) {
            typeUrlPrefix = "type.googleapis.com";
        }
        return typeUrlPrefix + "/JNInput";
    };

    return JNInput;
})();

$root.NActionDemo = (function() {

    /**
     * Properties of a NActionDemo.
     * @exports INActionDemo
     * @interface INActionDemo
     * @property {string|null} [message] NActionDemo message
     */

    /**
     * Constructs a new NActionDemo.
     * @exports NActionDemo
     * @classdesc Represents a NActionDemo.
     * @implements INActionDemo
     * @constructor
     * @param {INActionDemo=} [properties] Properties to set
     */
    function NActionDemo(properties) {
        if (properties)
            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                if (properties[keys[i]] != null)
                    this[keys[i]] = properties[keys[i]];
    }

    /**
     * NActionDemo message.
     * @member {string|null|undefined} message
     * @memberof NActionDemo
     * @instance
     */
    NActionDemo.prototype.message = null;

    // OneOf field names bound to virtual getters and setters
    var $oneOfFields;

    /**
     * NActionDemo _message.
     * @member {"message"|undefined} _message
     * @memberof NActionDemo
     * @instance
     */
    Object.defineProperty(NActionDemo.prototype, "_message", {
        get: $util.oneOfGetter($oneOfFields = ["message"]),
        set: $util.oneOfSetter($oneOfFields)
    });

    /**
     * Creates a new NActionDemo instance using the specified properties.
     * @function create
     * @memberof NActionDemo
     * @static
     * @param {INActionDemo=} [properties] Properties to set
     * @returns {NActionDemo} NActionDemo instance
     */
    NActionDemo.create = function create(properties) {
        return new NActionDemo(properties);
    };

    /**
     * Encodes the specified NActionDemo message. Does not implicitly {@link NActionDemo.verify|verify} messages.
     * @function encode
     * @memberof NActionDemo
     * @static
     * @param {INActionDemo} message NActionDemo message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    NActionDemo.encode = function encode(message, writer) {
        if (!writer)
            writer = $Writer.create();
        if (message.message != null && Object.hasOwnProperty.call(message, "message"))
            writer.uint32(/* id 1, wireType 2 =*/10).string(message.message);
        return writer;
    };

    /**
     * Encodes the specified NActionDemo message, length delimited. Does not implicitly {@link NActionDemo.verify|verify} messages.
     * @function encodeDelimited
     * @memberof NActionDemo
     * @static
     * @param {INActionDemo} message NActionDemo message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    NActionDemo.encodeDelimited = function encodeDelimited(message, writer) {
        return this.encode(message, writer).ldelim();
    };

    /**
     * Decodes a NActionDemo message from the specified reader or buffer.
     * @function decode
     * @memberof NActionDemo
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @param {number} [length] Message length if known beforehand
     * @returns {NActionDemo} NActionDemo
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    NActionDemo.decode = function decode(reader, length) {
        if (!(reader instanceof $Reader))
            reader = $Reader.create(reader);
        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.NActionDemo();
        while (reader.pos < end) {
            var tag = reader.uint32();
            switch (tag >>> 3) {
            case 1: {
                    message.message = reader.string();
                    break;
                }
            default:
                reader.skipType(tag & 7);
                break;
            }
        }
        return message;
    };

    /**
     * Decodes a NActionDemo message from the specified reader or buffer, length delimited.
     * @function decodeDelimited
     * @memberof NActionDemo
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @returns {NActionDemo} NActionDemo
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    NActionDemo.decodeDelimited = function decodeDelimited(reader) {
        if (!(reader instanceof $Reader))
            reader = new $Reader(reader);
        return this.decode(reader, reader.uint32());
    };

    /**
     * Verifies a NActionDemo message.
     * @function verify
     * @memberof NActionDemo
     * @static
     * @param {Object.<string,*>} message Plain object to verify
     * @returns {string|null} `null` if valid, otherwise the reason why it is not
     */
    NActionDemo.verify = function verify(message) {
        if (typeof message !== "object" || message === null)
            return "object expected";
        var properties = {};
        if (message.message != null && message.hasOwnProperty("message")) {
            properties._message = 1;
            if (!$util.isString(message.message))
                return "message: string expected";
        }
        return null;
    };

    /**
     * Creates a NActionDemo message from a plain object. Also converts values to their respective internal types.
     * @function fromObject
     * @memberof NActionDemo
     * @static
     * @param {Object.<string,*>} object Plain object
     * @returns {NActionDemo} NActionDemo
     */
    NActionDemo.fromObject = function fromObject(object) {
        if (object instanceof $root.NActionDemo)
            return object;
        var message = new $root.NActionDemo();
        if (object.message != null)
            message.message = String(object.message);
        return message;
    };

    /**
     * Creates a plain object from a NActionDemo message. Also converts values to other types if specified.
     * @function toObject
     * @memberof NActionDemo
     * @static
     * @param {NActionDemo} message NActionDemo
     * @param {$protobuf.IConversionOptions} [options] Conversion options
     * @returns {Object.<string,*>} Plain object
     */
    NActionDemo.toObject = function toObject(message, options) {
        if (!options)
            options = {};
        var object = {};
        if (message.message != null && message.hasOwnProperty("message")) {
            object.message = message.message;
            if (options.oneofs)
                object._message = "message";
        }
        return object;
    };

    /**
     * Converts this NActionDemo to JSON.
     * @function toJSON
     * @memberof NActionDemo
     * @instance
     * @returns {Object.<string,*>} JSON object
     */
    NActionDemo.prototype.toJSON = function toJSON() {
        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
    };

    /**
     * Gets the default type url for NActionDemo
     * @function getTypeUrl
     * @memberof NActionDemo
     * @static
     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
     * @returns {string} The default type url
     */
    NActionDemo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
        if (typeUrlPrefix === undefined) {
            typeUrlPrefix = "type.googleapis.com";
        }
        return typeUrlPrefix + "/NActionDemo";
    };

    return NActionDemo;
})();

$root.NActionDemo2 = (function() {

    /**
     * Properties of a NActionDemo2.
     * @exports INActionDemo2
     * @interface INActionDemo2
     * @property {string|null} [message] NActionDemo2 message
     */

    /**
     * Constructs a new NActionDemo2.
     * @exports NActionDemo2
     * @classdesc Represents a NActionDemo2.
     * @implements INActionDemo2
     * @constructor
     * @param {INActionDemo2=} [properties] Properties to set
     */
    function NActionDemo2(properties) {
        if (properties)
            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                if (properties[keys[i]] != null)
                    this[keys[i]] = properties[keys[i]];
    }

    /**
     * NActionDemo2 message.
     * @member {string|null|undefined} message
     * @memberof NActionDemo2
     * @instance
     */
    NActionDemo2.prototype.message = null;

    // OneOf field names bound to virtual getters and setters
    var $oneOfFields;

    /**
     * NActionDemo2 _message.
     * @member {"message"|undefined} _message
     * @memberof NActionDemo2
     * @instance
     */
    Object.defineProperty(NActionDemo2.prototype, "_message", {
        get: $util.oneOfGetter($oneOfFields = ["message"]),
        set: $util.oneOfSetter($oneOfFields)
    });

    /**
     * Creates a new NActionDemo2 instance using the specified properties.
     * @function create
     * @memberof NActionDemo2
     * @static
     * @param {INActionDemo2=} [properties] Properties to set
     * @returns {NActionDemo2} NActionDemo2 instance
     */
    NActionDemo2.create = function create(properties) {
        return new NActionDemo2(properties);
    };

    /**
     * Encodes the specified NActionDemo2 message. Does not implicitly {@link NActionDemo2.verify|verify} messages.
     * @function encode
     * @memberof NActionDemo2
     * @static
     * @param {INActionDemo2} message NActionDemo2 message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    NActionDemo2.encode = function encode(message, writer) {
        if (!writer)
            writer = $Writer.create();
        if (message.message != null && Object.hasOwnProperty.call(message, "message"))
            writer.uint32(/* id 1, wireType 2 =*/10).string(message.message);
        return writer;
    };

    /**
     * Encodes the specified NActionDemo2 message, length delimited. Does not implicitly {@link NActionDemo2.verify|verify} messages.
     * @function encodeDelimited
     * @memberof NActionDemo2
     * @static
     * @param {INActionDemo2} message NActionDemo2 message or plain object to encode
     * @param {$protobuf.Writer} [writer] Writer to encode to
     * @returns {$protobuf.Writer} Writer
     */
    NActionDemo2.encodeDelimited = function encodeDelimited(message, writer) {
        return this.encode(message, writer).ldelim();
    };

    /**
     * Decodes a NActionDemo2 message from the specified reader or buffer.
     * @function decode
     * @memberof NActionDemo2
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @param {number} [length] Message length if known beforehand
     * @returns {NActionDemo2} NActionDemo2
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    NActionDemo2.decode = function decode(reader, length) {
        if (!(reader instanceof $Reader))
            reader = $Reader.create(reader);
        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.NActionDemo2();
        while (reader.pos < end) {
            var tag = reader.uint32();
            switch (tag >>> 3) {
            case 1: {
                    message.message = reader.string();
                    break;
                }
            default:
                reader.skipType(tag & 7);
                break;
            }
        }
        return message;
    };

    /**
     * Decodes a NActionDemo2 message from the specified reader or buffer, length delimited.
     * @function decodeDelimited
     * @memberof NActionDemo2
     * @static
     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
     * @returns {NActionDemo2} NActionDemo2
     * @throws {Error} If the payload is not a reader or valid buffer
     * @throws {$protobuf.util.ProtocolError} If required fields are missing
     */
    NActionDemo2.decodeDelimited = function decodeDelimited(reader) {
        if (!(reader instanceof $Reader))
            reader = new $Reader(reader);
        return this.decode(reader, reader.uint32());
    };

    /**
     * Verifies a NActionDemo2 message.
     * @function verify
     * @memberof NActionDemo2
     * @static
     * @param {Object.<string,*>} message Plain object to verify
     * @returns {string|null} `null` if valid, otherwise the reason why it is not
     */
    NActionDemo2.verify = function verify(message) {
        if (typeof message !== "object" || message === null)
            return "object expected";
        var properties = {};
        if (message.message != null && message.hasOwnProperty("message")) {
            properties._message = 1;
            if (!$util.isString(message.message))
                return "message: string expected";
        }
        return null;
    };

    /**
     * Creates a NActionDemo2 message from a plain object. Also converts values to their respective internal types.
     * @function fromObject
     * @memberof NActionDemo2
     * @static
     * @param {Object.<string,*>} object Plain object
     * @returns {NActionDemo2} NActionDemo2
     */
    NActionDemo2.fromObject = function fromObject(object) {
        if (object instanceof $root.NActionDemo2)
            return object;
        var message = new $root.NActionDemo2();
        if (object.message != null)
            message.message = String(object.message);
        return message;
    };

    /**
     * Creates a plain object from a NActionDemo2 message. Also converts values to other types if specified.
     * @function toObject
     * @memberof NActionDemo2
     * @static
     * @param {NActionDemo2} message NActionDemo2
     * @param {$protobuf.IConversionOptions} [options] Conversion options
     * @returns {Object.<string,*>} Plain object
     */
    NActionDemo2.toObject = function toObject(message, options) {
        if (!options)
            options = {};
        var object = {};
        if (message.message != null && message.hasOwnProperty("message")) {
            object.message = message.message;
            if (options.oneofs)
                object._message = "message";
        }
        return object;
    };

    /**
     * Converts this NActionDemo2 to JSON.
     * @function toJSON
     * @memberof NActionDemo2
     * @instance
     * @returns {Object.<string,*>} JSON object
     */
    NActionDemo2.prototype.toJSON = function toJSON() {
        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
    };

    /**
     * Gets the default type url for NActionDemo2
     * @function getTypeUrl
     * @memberof NActionDemo2
     * @static
     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
     * @returns {string} The default type url
     */
    NActionDemo2.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
        if (typeUrlPrefix === undefined) {
            typeUrlPrefix = "type.googleapis.com";
        }
        return typeUrlPrefix + "/NActionDemo2";
    };

    return NActionDemo2;
})();

module.exports = $root;
